package jdklearning.classloader;


import java.net.URL;


public class ClassLoaderLearning1 {
	
	
	public static void main(String[] args) {
		
	}
	

	
	/**
	 * 方法1:ClassLoader.getSystemClassLoader方法无论何时均会返回ApplicationClassLoader,其只加载classpath下的class文件。

		在javaSE环境下，一般javaSE项目的classpath为bin/目录，因此只要编译后的class文件在classpath下就可以。此时ApplicationClassLoader就可以加载动态生成的类。

		但在javaEE环境下，我们的项目里的类是通过WebAppClassLoader类来加载的，此时我们获取了ApplicationClassLoader，因此自然找不到class文件。

		因此我们可以使用Thread.currentThread().getContextClassLoader()来获取WebAppClassLoader来加载，就不会报错了。


	方法2: 获取加载当前类的ClassLoader, 这个ClassLoader会随着环境的变化而变化, 
	可以看到第一次直接运行的ClassLoader是jvm自带的classLoader is:sun.misc.Launcher$AppClassLoader@7d05e560, 
	而在tomcat中是WebappClassLoader,它的父级是java.net.URLClassLoader@1ae8873a, 
	都能获取到properties文件, 所以方法2是可行的.

方法3:直接从当前对象的类调用getResource方法, 刚进去就调用了resolveName方法, 这个resolveName方法,
判断文件路径是以/ 开头还是./开头, 来确定是相对与当前class文件目录还是相对于程序根目录, 
然后也会像方法2那样获取加载当前类的ClassLoader, 如果获取不到则使用系统自带的ClassLoader.. 
这个方法比较智能,可以使用,但是跟其他方法相比, 需要加一个 /表示程序根目录.

方法4: 获取加载当前线程的ClassLoader,当前类是在当前线程调用的,则他们的ClassLoader对象是一样的, 
可以看他们输出的ClassLoader的内存地址是一样的. 
	 * @return
	 */
	
	public String testcode(){
		
		//方法1
        URL url1 = ClassLoader.getSystemResource("business.properties");
        System.out.println("url1:\t" + (url1 == null ? "null" : url1.getPath()));

        URL url1withSlash = ClassLoader.getSystemResource("/business.properties");
        System.out.println("url1/:\t" + (url1withSlash == null ? "null" : url1withSlash.getPath()));

        //方法2
        ClassLoader classLoader2 = this.getClass().getClassLoader();
        URL url2 = classLoader2.getResource("business.properties");
        System.out.println("url2:\t" + (url2 == null ? "null" : url2.getPath())+";classLoader is:"+classLoader2.toString());

        URL url2withSlash = classLoader2.getResource("/business.properties");
        System.out.println("url2/:\t" + (url2withSlash == null ? "null" : url2withSlash.getPath()));

        //方法3
        URL url3 = this.getClass().getResource("business.properties");
        System.out.println("url3:\t" + (url3 == null ? "null" : url3.getPath()));

        URL url3withSlash = this.getClass().getResource("/business.properties");
        System.out.println("url3/:\t" + (url3withSlash == null ? "null" : url3withSlash.getPath()));

        //方法4
        ClassLoader classLoader4 = Thread.currentThread().getContextClassLoader();
        URL url4 = classLoader4.getResource("business.properties");
        System.out.println("url4:\t" + (url4 == null ? "null" : url4.getPath())+";classLoader is:"+classLoader4.toString());

        URL url4withSlash = classLoader4.getResource("/business.properties");
        System.out.println("url4/:\t" + (url4withSlash == null ? "null" : url4withSlash.getPath()));
        return "OK";
	 }
	
	
	

}


